package com.bank.mapper;

import com.bank.entity.UserInfo;
import org.apache.ibatis.annotations.*;
import java.util.List;

/**
 * 用户信息数据访问接口
 * 提供对userInfo表的增删改查操作
 * 使用MyBatis注解方式实现SQL映射
 */
@Mapper
public interface UserInfoMapper {
    /**
     * 查询所有客户信息
     * @return 客户信息列表
     */
    @Select("SELECT * FROM userInfo")
    List<UserInfo> findAll();

    /**
     * 根据客户ID查询客户信息
     * @param customerID 客户ID
     * @return 客户信息对象
     */
    @Select("SELECT * FROM userInfo WHERE customerID = #{customerID}")
    UserInfo findById(Long customerID);

    /**
     * 新增客户信息
     * @param userInfo 客户信息对象
     * @return 影响的行数
     */
    @Insert("INSERT INTO userInfo(customerName, PID, telephone, address) " +
            "VALUES(#{customerName}, #{pid}, #{telephone}, #{address})")
    @Options(useGeneratedKeys = true, keyProperty = "customerID")
    int insert(UserInfo userInfo);

    /**
     * 修改客户信息
     * @param userInfo 客户信息对象
     * @return 影响的行数
     */
    @Update("UPDATE userInfo SET customerName = #{customerName}, PID = #{pid}, " +
            "telephone = #{telephone}, address = #{address} WHERE customerID = #{customerID}")
    int update(UserInfo userInfo);

    /**
     * 删除客户信息
     * @param customerID 客户ID
     * @return 影响的行数
     */
    @Delete("DELETE FROM userInfo WHERE customerID = #{customerID}")
    int deleteById(Long customerID);

    /**
     * 根据身份证号查询用户信息
     * @param pid 身份证号
     * @return 用户信息对象
     */
    @Select("SELECT * FROM userInfo WHERE PID = #{pid}")
    UserInfo findByPid(String pid);

    /**
     * 根据手机号查询用户信息
     * @param telephone 手机号
     * @return 用户信息对象
     */
    @Select("SELECT * FROM userInfo WHERE telephone = #{telephone}")
    UserInfo findByTelephone(String telephone);

    /**
     * 根据关键词查询用户信息
     * @param keyword 关键词
     * @return 用户信息列表
     */
    @Select("SELECT * FROM userInfo WHERE customerName LIKE #{keyword} OR PID LIKE #{keyword}")
    List<UserInfo> searchByKeyword(String keyword);

    /**
     * 根据客户ID范围查询用户信息
     * @param minId 最小客户ID
     * @param maxId 最大客户ID
     * @return 用户信息列表
     */
    @Select("SELECT * FROM userInfo WHERE customerID BETWEEN #{minId} AND #{maxId}")
    List<UserInfo> findByIdRange(Long minId, Long maxId);
}